home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / gnu / nethack.lha / nethack-3.1 / src / mon.c < prev    next >
C/C++ Source or Header  |  1993-01-21  |  43KB  |  1,655 lines

  1. /*    SCCS Id: @(#)mon.c    3.1    93/01/19    */
  2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  3. /* NetHack may be freely redistributed.  See license for details. */
  4.  
  5. /* If you're using precompiled headers, you don't want this either */
  6. #ifdef MICROPORT_BUG
  7. #define MKROOM_H
  8. #endif
  9.  
  10. #include "hack.h"
  11. #include "mfndpos.h"
  12. #include "edog.h"
  13. #include <ctype.h>
  14.  
  15. STATIC_DCL boolean FDECL(restrap,(struct monst *));
  16. STATIC_DCL void NDECL(dmonsfree);
  17.  
  18. #ifdef OVL1
  19. #define warnDelay 10
  20. long lastwarntime;
  21. int lastwarnlev;
  22. const char *warnings[] = {
  23.     "white", "pink", "red", "ruby", "purple", "black" };
  24.  
  25. static void NDECL(warn_effects);
  26.  
  27. #endif /* OVL1 */
  28.  
  29. #ifdef OVLB
  30. static struct obj *FDECL(make_corpse,(struct monst *));
  31. static void FDECL(m_detach,(struct monst *));
  32.  
  33. struct monst *fdmon;    /* chain of dead monsters, need not be saved */
  34.             /* otherwise used only in priest.c */
  35.  
  36. /* Creates a monster corpse, a "special" corpse, or nothing if it doesn't
  37.  * leave corpses.  Monsters which leave "special" corpses should have
  38.  * G_NOCORPSE set in order to prevent wishing for one, finding tins of one,
  39.  * etc....
  40.  */
  41. static struct obj *
  42. make_corpse(mtmp)
  43. register struct monst *mtmp;
  44. {
  45.     register struct permonst *mdat = mtmp->data;
  46.     int num;
  47.     struct obj *obj = (struct obj *)0;
  48.     int x = mtmp->mx, y = mtmp->my;
  49.     int mndx = monsndx(mdat);
  50.  
  51.     switch(mndx) {
  52.         case PM_GRAY_DRAGON:
  53.         case PM_RED_DRAGON:
  54.         case PM_ORANGE_DRAGON:
  55.         case PM_WHITE_DRAGON:
  56.         case PM_BLACK_DRAGON:
  57.         case PM_BLUE_DRAGON:
  58.         case PM_GREEN_DRAGON:
  59.         case PM_YELLOW_DRAGON:
  60.         /* Make dragon scales.  This assumes that the order of the */
  61.         /* dragons is the same as the order of the scales.       */
  62.         if (!rn2(3)) {
  63.             obj = mksobj_at(GRAY_DRAGON_SCALES +
  64.                     monsndx(mdat)-PM_GRAY_DRAGON, x, y, FALSE);
  65.             obj->spe = 0;
  66.             obj->cursed = obj->blessed = FALSE;
  67.         }
  68.         goto default_1;
  69.  
  70.         case PM_WHITE_UNICORN:
  71.         case PM_GRAY_UNICORN:
  72.         case PM_BLACK_UNICORN:
  73.         (void) mksobj_at(UNICORN_HORN, x, y, TRUE);
  74.         goto default_1;
  75.         case PM_LONG_WORM:
  76.         (void) mksobj_at(WORM_TOOTH, x, y, TRUE);
  77.         goto default_1;
  78.         case PM_KOBOLD_MUMMY:
  79.         case PM_GNOME_MUMMY:
  80.         case PM_ORC_MUMMY:
  81.         case PM_ELF_MUMMY:
  82.         case PM_HUMAN_MUMMY:
  83.         case PM_GIANT_MUMMY:
  84.         case PM_ETTIN_MUMMY:
  85.         (void) mksobj_at(MUMMY_WRAPPING, x, y, TRUE); /* and fall through */
  86.         case PM_KOBOLD_ZOMBIE:
  87.         case PM_GNOME_ZOMBIE:
  88.         case PM_ORC_ZOMBIE:
  89.         case PM_ELF_ZOMBIE:
  90.         case PM_HUMAN_ZOMBIE:
  91.         case PM_GIANT_ZOMBIE:
  92.         case PM_ETTIN_ZOMBIE:
  93.         switch (mndx) {
  94.             case PM_KOBOLD_ZOMBIE:
  95.             case PM_KOBOLD_MUMMY:
  96.             num = PM_KOBOLD; break;
  97.             case PM_GNOME_MUMMY:
  98.             case PM_GNOME_ZOMBIE:
  99.             num = PM_GNOME; break;
  100.             case PM_ORC_MUMMY:
  101.             case PM_ORC_ZOMBIE:
  102.             num = PM_ORC; break;
  103.             case PM_ELF_MUMMY:
  104.             case PM_ELF_ZOMBIE:
  105.             num = PM_ELF; break;
  106.             case PM_HUMAN_MUMMY:
  107.             case PM_HUMAN_ZOMBIE:
  108.             num = PM_HUMAN; break;
  109.             case PM_GIANT_MUMMY:
  110.             case PM_GIANT_ZOMBIE:
  111.             num = PM_GIANT; break;
  112.             case PM_ETTIN_MUMMY:
  113.             case PM_ETTIN_ZOMBIE:
  114. #ifdef GCC_WARN
  115.             default:
  116. #endif
  117.             num = PM_ETTIN; break;
  118.         }
  119.         obj = mkcorpstat(CORPSE, &mons[num], x, y, TRUE);
  120.         obj->age -= 100;        /* this is an *OLD* corpse */
  121.         break;
  122.         case PM_IRON_GOLEM:
  123.         num = d(2,6);
  124.         while (num--)
  125.             obj = mksobj_at(IRON_CHAIN, x, y, TRUE);
  126.         mtmp->mnamelth = 0;
  127.         break;
  128.         case PM_CLAY_GOLEM:
  129.         obj = mksobj_at(ROCK, x, y, FALSE);
  130.         obj->quan = (long)(rn2(20) + 50);
  131.         obj->owt = weight(obj);
  132.         mtmp->mnamelth = 0;
  133.         break;
  134.         case PM_STONE_GOLEM:
  135.         obj = mkcorpstat(STATUE, mdat, x, y, FALSE);
  136.         break;
  137.         case PM_WOOD_GOLEM:
  138.         num = d(2,4);
  139.         while(num--) {
  140.             obj = mksobj_at(QUARTERSTAFF, x, y, TRUE);
  141.             if (obj && obj->oartifact) {    /* don't allow this */
  142.                 artifact_exists(obj, ONAME(obj), FALSE);
  143.                 Strcpy(ONAME(obj), "");  obj->onamelth = 0;
  144.             }
  145.         }
  146.         mtmp->mnamelth = 0;
  147.         break;
  148.         case PM_LEATHER_GOLEM:
  149.         num = d(2,4);
  150.         while(num--)
  151.             obj = mksobj_at(LEATHER_ARMOR, x, y, TRUE);
  152.         mtmp->mnamelth = 0;
  153.         break;
  154.         default_1:
  155.         default:
  156.         if (mdat->geno & G_NOCORPSE)
  157.             return (struct obj *)0;
  158.         else obj = mkcorpstat(CORPSE, mdat, x, y, TRUE);
  159.         break;
  160.     }
  161.     /* All special cases should precede the G_NOCORPSE check */
  162.  
  163.     /* Note: oname() cannot be used generically for non-inventory objects
  164.      * unless you fix the link from the previous object in the chains.
  165.      * (Here we know it's the first one, so there was no link.)
  166.      */
  167.     if (mtmp->mnamelth) {
  168.         obj = oname(obj, NAME(mtmp), 0);
  169.         fobj = obj;
  170.         level.objects[x][y] = obj;
  171.     }
  172.     stackobj(fobj);
  173.     newsym(x, y);
  174.     return obj;
  175. }
  176.  
  177. #endif /* OVLB */
  178. #ifdef OVL1
  179.  
  180. static void
  181. warn_effects()
  182. {
  183.     if (warnlevel == 100) {
  184.     if(!Blind &&
  185.         (warnlevel > lastwarnlev || moves > lastwarntime + warnDelay)) {
  186.         Your("%s %s!", aobjnam(uwep, "glow"),
  187.          Hallucination ? hcolor() : light_blue);
  188.         lastwarnlev = warnlevel;
  189.         lastwarntime = moves;
  190.     }
  191.     warnlevel = 0;
  192.     return;
  193.     }
  194.  
  195.     if(warnlevel >= SIZE(warnings))
  196.     warnlevel = SIZE(warnings)-1;
  197.     if(!Blind && warnlevel >= 0)
  198.     if(warnlevel > lastwarnlev || moves > lastwarntime + warnDelay) {
  199.         register const char *rr;
  200.  
  201.         lastwarntime = moves;
  202.         lastwarnlev = warnlevel;
  203.         switch((int) (Warning & (LEFT_RING | RIGHT_RING))) {
  204.         case LEFT_RING:
  205.         rr = Hallucination ? "left mood ring glows" : "left ring glows";
  206.         break;
  207.         case RIGHT_RING:
  208.         rr = Hallucination ? "right mood ring glows"
  209.             : "right ring glows";
  210.         break;
  211.         case LEFT_RING | RIGHT_RING:
  212.         rr = Hallucination ? "mood rings glow" : "rings both glow";
  213.         break;
  214.         default:
  215.         if (Hallucination)
  216.             Your("spider-sense is tingling....");
  217.         else
  218.             You("feel apprehensive as you sense a %s flash.",
  219.             warnings[warnlevel]);
  220.         return;
  221.         }
  222.         Your("%s %s!", rr, Hallucination ? hcolor() : warnings[warnlevel]);
  223.     }
  224. }
  225.  
  226. /* check mtmp and water for compatibility, 0 (survived), 1 (drowned) */
  227. int
  228. minwater(mtmp)
  229. register struct monst *mtmp;
  230. {
  231.     boolean inpool, infountain;
  232.  
  233.     inpool = is_pool(mtmp->mx,mtmp->my);
  234.     infountain = IS_FOUNTAIN(levl[mtmp->mx][mtmp->my].typ);
  235.  
  236.     /* Gremlin multiplying won't go on forever since the hit points
  237.      * keep going down, and when it gets to 1 hit point the clone
  238.      * function will fail.
  239.      */
  240.     if(mtmp->data->mlet == S_GREMLIN && (inpool || infountain) && rn2(3)) {
  241.     struct monst *mtmp2 = clone_mon(mtmp);
  242.  
  243.     if (mtmp2) {
  244.         mtmp2->mhpmax = (mtmp->mhpmax /= 2);
  245.         if(cansee(mtmp->mx,mtmp->my))
  246.         pline("%s multiplies.", Monnam(mtmp));
  247.         dryup(mtmp->mx,mtmp->my);
  248.     }
  249.     return (0);
  250.     }
  251.     if (inpool) {
  252.     /* most monsters drown in pools */
  253.     if (!is_flyer(mtmp->data) && !is_clinger(mtmp->data)
  254.         && !is_swimmer(mtmp->data) && !magic_breathing(mtmp->data)) {
  255.         if (cansee(mtmp->mx,mtmp->my))
  256.         pline("%s drowns.", Monnam(mtmp));
  257.         mondead(mtmp);
  258.         return (1);
  259.     }
  260.     } else {
  261.     /* but eels have a difficult time outside */
  262.     if (mtmp->data->mlet == S_EEL) {
  263.         if(mtmp->mhp > 1) mtmp->mhp--;
  264.         mtmp->mflee = 1;
  265.         mtmp->mfleetim += 2;
  266.     }
  267.     }
  268.     return (0);
  269. }
  270.  
  271. void
  272. movemon()
  273. {
  274.     register struct monst *mtmp;
  275.     register boolean tametype = TRUE;
  276.  
  277.     warnlevel = 0;
  278.  
  279.     while(1) {
  280.     /* Find a monster that we have not treated yet.
  281.      * Note that mtmp or mtmp->nmon might get killed
  282.      * while mtmp moves, so we cannot just walk down the
  283.      * chain (even new monsters might get created!)
  284.      *
  285.      * Do tame monsters first.  Necessary so that when the tame
  286.      * monster attacks something, the something gets a chance to
  287.      * attack the tame monster back (which it's permitted to do
  288.      * only if it hasn't made its move yet).
  289.      */
  290.     for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
  291.         if(mtmp->mlstmv < monstermoves &&
  292.            ((mtmp->mtame>0) == tametype)) goto next_mon;
  293.     if(tametype) {
  294.         /* checked all tame monsters, now do other ones */
  295.         tametype = FALSE;
  296.         continue;
  297.     }
  298.     /* treated all monsters */
  299.     break;
  300.  
  301.     next_mon:
  302.     mtmp->mlstmv = monstermoves;
  303.  
  304.     if(mtmp->mhp <= 0) {
  305.         impossible("Monster with zero hp?");
  306.         mtmp->mhp = mtmp->mhpmax = 1; /* repair */
  307.     }
  308.     if (minwater(mtmp)) continue;
  309.  
  310.     if(mtmp->mblinded && !--mtmp->mblinded)
  311.         mtmp->mcansee = 1;
  312.     if(mtmp->mfrozen && !--mtmp->mfrozen)
  313.         mtmp->mcanmove = 1;
  314.     if(mtmp->mfleetim && !--mtmp->mfleetim)
  315.         mtmp->mflee = 0;
  316.     if (is_hider(mtmp->data)) {
  317.         /* unwatched mimics and piercers may hide again  [MRS] */
  318.         if(restrap(mtmp))   continue;
  319.         if(mtmp->m_ap_type == M_AP_FURNITURE ||
  320.                     mtmp->m_ap_type == M_AP_OBJECT)
  321.             continue;
  322.         if(mtmp->mundetected) continue;
  323.     }
  324.     if(mtmp->mspeed != MSLOW || !(moves%2)) {
  325.         /* continue if the monster died fighting */
  326.         if (Conflict && !mtmp->iswiz && mtmp->mcansee) {
  327.         /* Note:
  328.          *  Conflict does not take effect in the first round.
  329.          *  Therefore, A monster when stepping into the area will
  330.          *  get to swing at you.
  331.          *
  332.          *  The call to fightm() must be _last_.  The monster might
  333.          *  have died if it returns 1.
  334.          */
  335.         if (couldsee(mtmp->mx,mtmp->my) &&
  336.             (distu(mtmp->mx,mtmp->my) <= BOLT_LIM*BOLT_LIM) &&
  337.                                 fightm(mtmp))
  338.              continue;    /* mon might have died */
  339.         }
  340.         if(dochugw(mtmp))
  341.         /* otherwise just move the monster */
  342.         continue;
  343.     }
  344.     if(mtmp->mspeed == MFAST && dochugw(mtmp))
  345.         continue;
  346.     }
  347.     if(warnlevel > 0)
  348.     warn_effects();
  349.  
  350.     dmonsfree(); /* remove all dead monsters */
  351. }
  352.  
  353. #endif /* OVL1 */
  354. #ifdef OVLB
  355.  
  356. void
  357. meatgold(mtmp)
  358.     register struct monst *mtmp;
  359. {
  360.     register struct obj *otmp;
  361.  
  362.     /* If a pet, eating is handled separately, in dog.c */
  363.     if (mtmp->mtame) return;
  364.  
  365.     /* Eats topmost metal object if it is there */
  366.     for (otmp = level.objects[mtmp->mx][mtmp->my];
  367.                             otmp; otmp = otmp->nexthere)
  368.         if (is_metallic(otmp) && touch_artifact(otmp,mtmp)) {
  369.             if (cansee(mtmp->mx,mtmp->my) && flags.verbose)
  370.             pline("%s eats %s!", Monnam(mtmp),
  371.                 distant_name(otmp,doname));
  372.             else if (flags.soundok && flags.verbose)
  373.             You("hear a crunching sound.");
  374.             mtmp->meating = otmp->owt/2 + 1;
  375.             /* Heal up to the object's weight in hp */
  376.             if (mtmp->mhp < mtmp->mhpmax) {
  377.             mtmp->mhp += objects[otmp->otyp].oc_weight;
  378.             if (mtmp->mhp > mtmp->mhpmax) mtmp->mhp = mtmp->mhpmax;
  379.             }
  380.             if(otmp == uball) {
  381.             unpunish();
  382.             delobj(otmp);
  383.             } else if(otmp == uchain)
  384.             unpunish();    /* frees uchain */
  385.             else
  386.             delobj(otmp);
  387.             /* Left behind a pile? */
  388.             if(rnd(25) < 3) (void) mksobj_at(ROCK, mtmp->mx, mtmp->my, TRUE);
  389.             newsym(mtmp->mx, mtmp->my);
  390.             break;
  391.         }
  392. }
  393.  
  394. void
  395. meatobj(mtmp)        /* for gelatinous cubes */
  396.     register struct monst *mtmp;
  397. {
  398.     register struct obj *otmp, *otmp2;
  399.  
  400.     /* If a pet, eating is handled separately, in dog.c */
  401.     if (mtmp->mtame) return;
  402.  
  403.     /* Eats organic objects, including cloth and wood, if there */
  404.     /* Engulfs others, except huge rocks and metal attached to player */
  405.     for (otmp = level.objects[mtmp->mx][mtmp->my]; otmp; otmp = otmp2) {
  406.         otmp2 = otmp->nexthere;
  407.         if(is_organic(otmp) && touch_artifact(otmp,mtmp)) {
  408.         if (otmp->otyp == CORPSE && otmp->corpsenm == PM_COCKATRICE
  409.                         && !resists_ston(mtmp->data))
  410.             continue;
  411.         if (cansee(mtmp->mx,mtmp->my) && flags.verbose)
  412.             pline("%s eats %s!", Monnam(mtmp),
  413.                 distant_name(otmp, doname));
  414.         else if (flags.soundok && flags.verbose)
  415.             You("hear a slurping sound.");
  416.         /* Heal up to the object's weight in hp */
  417.         if (mtmp->mhp < mtmp->mhpmax) {
  418.             mtmp->mhp += objects[otmp->otyp].oc_weight;
  419.             if (mtmp->mhp > mtmp->mhpmax) mtmp->mhp = mtmp->mhpmax;
  420.         }
  421.         delobj(otmp);        /* munch */
  422.         } else if (otmp->oclass != ROCK_CLASS &&
  423.                     otmp != uball && otmp != uchain) {
  424.         if (cansee(mtmp->mx, mtmp->my) && flags.verbose)
  425.             pline("%s engulfs %s.", Monnam(mtmp),
  426.                 distant_name(otmp,doname));
  427.         freeobj(otmp);
  428.         mpickobj(mtmp, otmp);    /* slurp */
  429.         }
  430.         /* Engulf & devour is instant, so don't set meating */
  431.         newsym(mtmp->mx, mtmp->my);
  432.     }
  433. }
  434.  
  435. void
  436. mpickgold(mtmp)
  437.     register struct monst *mtmp;
  438. {
  439.     register struct obj *gold;
  440.  
  441.     if ((gold = g_at(mtmp->mx, mtmp->my)) != 0) {
  442.     mtmp->mgold += gold->quan;
  443.     delobj(gold);
  444.     if (cansee(mtmp->mx, mtmp->my) ) {
  445.         if (flags.verbose && !mtmp->isgd)
  446.         pline("%s picks up some gold.", Monnam(mtmp));
  447.         newsym(mtmp->mx, mtmp->my);
  448.     }
  449.     }
  450. }
  451.  
  452. /* Now includes giants which pick up enormous rocks.  KAA */
  453. void
  454. mpickgems(mtmp)
  455.     register struct monst *mtmp;
  456. {
  457.     register struct obj *otmp;
  458.  
  459.     for(otmp = level.objects[mtmp->mx][mtmp->my]; otmp; otmp=otmp->nexthere)
  460.         if(throws_rocks(mtmp->data) ? otmp->otyp == BOULDER :
  461.         (otmp->oclass == GEM_CLASS &&
  462.          objects[otmp->otyp].oc_material != MINERAL))
  463.         if (touch_artifact(otmp,mtmp))
  464.         if(mtmp->data->mlet != S_UNICORN
  465.             || objects[otmp->otyp].oc_material == GEMSTONE){
  466.             if (cansee(mtmp->mx,mtmp->my) && flags.verbose)
  467.             pline("%s picks up %s.", Monnam(mtmp),
  468.                 distant_name(otmp, doname));
  469.             freeobj(otmp);
  470.             mpickobj(mtmp, otmp);
  471.             if (otmp->otyp == BOULDER)
  472.             unblock_point(otmp->ox,otmp->oy);    /* vision */
  473.             newsym(mtmp->mx, mtmp->my);
  474.             return;    /* pick only one object */
  475.         }
  476. }
  477.  
  478. #endif /* OVLB */
  479. #ifdef OVL2
  480.  
  481. void
  482. mpickstuff(mtmp, str)
  483.     register struct monst *mtmp;
  484.     register const char *str;
  485. {
  486.     register struct obj *otmp;
  487.  
  488. /*    prevent shopkeepers from leaving the door of their shop */
  489.     if(mtmp->isshk && inhishop(mtmp)) return;
  490.  
  491.     for(otmp = level.objects[mtmp->mx][mtmp->my]; otmp; otmp=otmp->nexthere)
  492. /*    Nymphs take everything.  Most monsters don't pick up corpses. */
  493.         if (
  494. #ifdef MUSE
  495.         !str ? searches_for_item(mtmp,otmp) :
  496. #endif
  497.           (index(str, otmp->oclass)
  498.            && (otmp->otyp != CORPSE || mtmp->data->mlet == S_NYMPH))) {
  499.         if (!touch_artifact(otmp,mtmp)) return;
  500.         if (!can_carry(mtmp,otmp)) return;
  501.         if (cansee(mtmp->mx,mtmp->my) && flags.verbose)
  502.             pline("%s picks up %s.", Monnam(mtmp), doname(otmp));
  503.         freeobj(otmp);
  504.         mpickobj(mtmp, otmp);
  505. #ifdef MUSE
  506.         m_dowear(mtmp, FALSE);
  507. #endif
  508.         newsym(mtmp->mx, mtmp->my);
  509.         return;            /* pick only one object */
  510.         }
  511. }
  512.  
  513. #endif /* OVL2 */
  514. #ifdef OVL0
  515.  
  516. int
  517. curr_mon_load(mtmp)
  518. register struct monst *mtmp;
  519. {
  520.     register int curload = 0;
  521.     register struct obj *obj;
  522.  
  523.     for(obj = mtmp->minvent; obj; obj = obj->nobj) {
  524.         if(obj->otyp != BOULDER || !throws_rocks(mtmp->data))
  525.             curload += obj->owt;
  526.     }
  527.  
  528.     return curload;
  529. }
  530.  
  531. int
  532. max_mon_load(mtmp)
  533. register struct monst *mtmp;
  534. {
  535.     register long maxload;
  536.  
  537.     /* Base monster carrying capacity is equal to human maximum
  538.      * carrying capacity, or half human maximum if not strong.
  539.      * (for a polymorphed player, the value used would be the
  540.      * non-polymorphed carrying capacity instead of max/half max).
  541.      * This is then modified by the ratio between the monster weights
  542.      * and human weights.  Corpseless monsters are given a capacity
  543.      * proportional to their size instead of weight.
  544.      */
  545.     if (!mtmp->data->cwt)
  546.         maxload = (MAX_CARR_CAP * (long)mtmp->data->msize) / MZ_HUMAN;
  547.     else if (!strongmonst(mtmp->data)
  548.         || (strongmonst(mtmp->data) && (mtmp->data->cwt > WT_HUMAN)))
  549.         maxload = (MAX_CARR_CAP * (long)mtmp->data->cwt) / WT_HUMAN;
  550.     else    maxload = MAX_CARR_CAP; /*strong monsters w/cwt <= WT_HUMAN*/
  551.  
  552.     if (!strongmonst(mtmp->data)) maxload /= 2;
  553.  
  554.     if (maxload < 1) maxload = 1;
  555.  
  556.     return (int) maxload;
  557. }
  558.  
  559. /* for restricting monsters' object-pickup */
  560. boolean
  561. can_carry(mtmp,otmp)
  562. struct monst *mtmp;
  563. struct obj *otmp;
  564. {
  565.     register int newload = otmp->owt;
  566.  
  567.     if (otmp->otyp == CORPSE && otmp->corpsenm == PM_COCKATRICE
  568.                         && !resists_ston(mtmp->data))
  569.         return(FALSE);
  570.     if (mtmp->isshk) return(TRUE); /* no limit */
  571.     if (mtmp->mpeaceful && !mtmp->mtame) return(FALSE);
  572.     /* otherwise players might find themselves obligated to violate
  573.      * their alignment if the monster takes something they need
  574.      */
  575.  
  576.     /* special--boulder throwers carry unlimited amounts of boulders */
  577.     if (throws_rocks(mtmp->data) && otmp->otyp == BOULDER)
  578.         return(TRUE);
  579.  
  580.     /* nymphs deal in stolen merchandise, but not boulders or statues */
  581.     if (mtmp->data->mlet == S_NYMPH)
  582.         return !(otmp->oclass == ROCK_CLASS);
  583.  
  584.     if(curr_mon_load(mtmp) + newload > max_mon_load(mtmp)) return(FALSE);
  585.  
  586.     return(TRUE);
  587. }
  588.  
  589. /* return number of acceptable neighbour positions */
  590. int
  591. mfndpos(mon, poss, info, flag)
  592.     register struct monst *mon;
  593.     coord *poss;    /* coord poss[9] */
  594.     long *info;    /* long info[9] */
  595.     long flag;
  596. {
  597.     register xchar x,y,nx,ny;
  598.     register int cnt = 0;
  599.     register uchar ntyp;
  600.     uchar nowtyp;
  601.     boolean wantpool,poolok,lavaok,nodiag;
  602.     int maxx, maxy;
  603.  
  604.     x = mon->mx;
  605.     y = mon->my;
  606.     nowtyp = levl[x][y].typ;
  607.  
  608.     nodiag = (mon->data == &mons[PM_GRID_BUG]);
  609.     wantpool = mon->data->mlet == S_EEL;
  610.     poolok = is_flyer(mon->data) || is_clinger(mon->data) ||
  611.          (is_swimmer(mon->data) && !wantpool);
  612.     lavaok = is_flyer(mon->data) || is_clinger(mon->data) ||
  613.          (mon->data == &mons[PM_FIRE_ELEMENTAL]);
  614. nexttry:    /* eels prefer the water, but if there is no water nearby,
  615.            they will crawl over land */
  616.     if(mon->mconf) {
  617.         flag |= ALLOW_ALL;
  618.         flag &= ~NOTONL;
  619.     }
  620.     if(!mon->mcansee)
  621.         flag |= ALLOW_SSM;
  622.     maxx = min(x+1,COLNO-1);
  623.     maxy = min(y+1,ROWNO-1);
  624.     for(nx = max(1,x-1); nx <= maxx; nx++)
  625.       for(ny = max(0,y-1); ny <= maxy; ny++) {
  626.         if(nx == x && ny == y) continue;
  627.         if(IS_ROCK(ntyp = levl[nx][ny].typ) && !(flag & ALLOW_WALL) &&
  628.         !((flag & ALLOW_DIG) && may_dig(nx,ny))) continue;
  629.         if(IS_DOOR(ntyp) && !amorphous(mon->data) &&
  630.            ((levl[nx][ny].doormask & D_CLOSED && !(flag & OPENDOOR)) ||
  631.         (levl[nx][ny].doormask & D_LOCKED && !(flag & UNLOCKDOOR))
  632.            ) && !(flag & (ALLOW_WALL|ALLOW_DIG|BUSTDOOR))) continue;
  633.         if(nx != x && ny != y && (nodiag ||
  634. #ifdef REINCARNATION
  635.            ((IS_DOOR(nowtyp) &&
  636.          ((levl[x][y].doormask & ~D_BROKEN) || Is_rogue_level(&u.uz))) ||
  637.         (IS_DOOR(ntyp) &&
  638.          ((levl[nx][ny].doormask & ~D_BROKEN) || Is_rogue_level(&u.uz))))
  639. #else
  640.            ((IS_DOOR(nowtyp) && (levl[x][y].doormask & ~D_BROKEN)) ||
  641.         (IS_DOOR(ntyp) && (levl[nx][ny].doormask & ~D_BROKEN)))
  642. #endif
  643.            ))
  644.         continue;
  645.         if((is_pool(nx,ny) == wantpool || poolok) &&
  646.            (lavaok || !is_lava(nx,ny))) {
  647.         int dispx, dispy;
  648.         boolean monseeu = (!Invis || perceives(mon->data));
  649.         boolean checkobj = OBJ_AT(nx,ny);
  650.  
  651.         /* Displacement also displaces the Elbereth/scare monster,
  652.          * as long as you are visible.
  653.          */
  654.         if(Displaced && monseeu && (mon->mux==nx) && (mon->muy==ny)) {
  655.             dispx = u.ux;
  656.             dispy = u.uy;
  657.         } else {
  658.             dispx = nx;
  659.             dispy = ny;
  660.         }
  661.  
  662.         info[cnt] = 0;
  663.         if(((checkobj || Displaced) &&
  664.             sobj_at(SCR_SCARE_MONSTER, dispx, dispy))
  665. #ifdef ELBERETH
  666.                || sengr_at("Elbereth", dispx, dispy)
  667. #endif
  668.                ) {
  669.             if(!(flag & ALLOW_SSM)) continue;
  670.             info[cnt] |= ALLOW_SSM;
  671.         }
  672.         if((nx == u.ux && ny == u.uy) ||
  673.            (nx == mon->mux && ny == mon->muy)) {
  674.             if (nx == u.ux && ny == u.uy) {
  675.                 /* If it's right next to you, it found you,
  676.                  * displaced or no.  We must set mux and muy
  677.                  * right now, so when we return we can tell
  678.                  * that the ALLOW_U means to attack _you_ and
  679.                  * not the image.
  680.                  */
  681.                 mon->mux = u.ux;
  682.                 mon->muy = u.uy;
  683.             }
  684.             if(!(flag & ALLOW_U)) continue;
  685.             info[cnt] |= ALLOW_U;
  686.         } else {
  687.             if(MON_AT(nx, ny)) {
  688.                 if(!(flag & ALLOW_M)) continue;
  689.                 info[cnt] |= ALLOW_M;
  690.                 if((m_at(nx,ny))->mtame) {
  691.                     if(!(flag & ALLOW_TM)) continue;
  692.                     info[cnt] |= ALLOW_TM;
  693.                 }
  694.             }
  695.             /* Note: ALLOW_SANCT only prevents movement, not */
  696.             /* attack, into a temple. */
  697.             if(level.flags.has_temple &&
  698.                *in_rooms(nx, ny, TEMPLE) &&
  699.                !*in_rooms(x, y, TEMPLE) &&
  700.                in_your_sanctuary(nx, ny)){
  701.                 if(!(flag & ALLOW_SANCT)) continue;
  702.                 info[cnt] |= ALLOW_SANCT;
  703.             }
  704.         }
  705.         if(checkobj && sobj_at(CLOVE_OF_GARLIC, nx, ny)) {
  706.             if(flag & NOGARLIC) continue;
  707.             info[cnt] |= NOGARLIC;
  708.         }
  709.         if(checkobj && sobj_at(BOULDER, nx, ny)) {
  710.             if(!(flag & ALLOW_ROCK)) continue;
  711.             info[cnt] |= ALLOW_ROCK;
  712.         }
  713.         if (monseeu && onlineu(nx,ny)) {
  714.             if(flag & NOTONL) continue;
  715.             info[cnt] |= NOTONL;
  716.         }
  717.         /* we cannot avoid traps of an unknown kind */
  718.         { register struct trap *ttmp = t_at(nx, ny);
  719.           register long tt;
  720.             if(ttmp) {
  721.                 if(ttmp->ttyp >= TRAPNUM || ttmp->ttyp == 0)  {
  722. impossible("A monster looked at a very strange trap of type %d.", ttmp->ttyp);
  723.                     continue;
  724.                 }
  725.                 tt = 1L << ttmp->ttyp;
  726.                 if(mon->mtrapseen & tt) {
  727.  
  728.                     if(!(flag & tt)) continue;
  729.                     info[cnt] |= tt;
  730.                 }
  731.             }
  732.         }
  733.         poss[cnt].x = nx;
  734.         poss[cnt].y = ny;
  735.         cnt++;
  736.         }
  737.     }
  738.     if(!cnt && wantpool && !is_pool(x,y)) {
  739.         wantpool = FALSE;
  740.         goto nexttry;
  741.     }
  742.     return(cnt);
  743. }
  744.  
  745. #endif /* OVL0 */
  746. #ifdef OVL1
  747.  
  748. boolean
  749. monnear(mon, x, y)
  750. register struct monst *mon;
  751. register int x,y;
  752. /* Is the square close enough for the monster to move or attack into? */
  753. {
  754.     register int distance = dist2(mon->mx, mon->my, x, y);
  755.     if (distance==2 && mon->data==&mons[PM_GRID_BUG]) return 0;
  756.     return (distance < 3);
  757. }
  758.  
  759. #endif /* OVL1 */
  760. #ifdef OVL2
  761.  
  762. STATIC_OVL void
  763. dmonsfree()
  764. {
  765. register struct monst *mtmp;
  766.     while ((mtmp = fdmon) != 0) {
  767.         fdmon = mtmp->nmon;
  768.         dealloc_monst(mtmp);
  769.     }
  770. }
  771.  
  772. #endif /* OVL2 */
  773. #ifdef OVLB
  774. /* we do not free monsters immediately, in order to have their name
  775.    available shortly after their demise */
  776. void
  777. monfree(mtmp)
  778. register struct monst *mtmp;
  779. {
  780.     mtmp->nmon = fdmon;
  781.     fdmon = mtmp;
  782. }
  783.  
  784. /* called when monster is moved to larger structure */
  785. void
  786. replmon(mtmp, mtmp2)
  787. register struct monst *mtmp, *mtmp2;
  788. {
  789.     relmon(mtmp);
  790.     monfree(mtmp);
  791.     place_monster(mtmp2, mtmp2->mx, mtmp2->my);
  792.     if (mtmp2->wormno)        /* update level.monsters[wseg->wx][wseg->wy] */
  793.     place_wsegs(mtmp2); /* locations to mtmp2 not mtmp. */
  794.     mtmp2->nmon = fmon;
  795.     fmon = mtmp2;
  796.     if (u.ustuck == mtmp) u.ustuck = mtmp2;
  797.     if (mtmp2->isshk) replshk(mtmp,mtmp2);
  798. }
  799.  
  800. /* release mon from display and monster list */
  801. void
  802. relmon(mon)
  803. register struct monst *mon;
  804. {
  805.     register struct monst *mtmp;
  806.  
  807.     if (fmon == (struct monst *)0)  panic ("relmon: no fmon available.");
  808.  
  809.     remove_monster(mon->mx, mon->my);
  810.  
  811.     if(mon == fmon) fmon = fmon->nmon;
  812.     else {
  813.         for(mtmp = fmon; mtmp && mtmp->nmon != mon; mtmp = mtmp->nmon) ;
  814.         if(mtmp)    mtmp->nmon = mon->nmon;
  815.         else        panic("relmon: mon not in list.");
  816.     }
  817. }
  818.  
  819. /* remove effects of mtmp from other data structures */
  820. static void
  821. m_detach(mtmp)
  822. register struct monst *mtmp;
  823. {
  824. #ifdef WALKIES
  825.     if(mtmp->mleashed) m_unleash(mtmp);
  826. #endif
  827.         /* to prevent an infinite relobj-flooreffects-hmon-killed loop */
  828.     mtmp->mtrapped = 0;
  829.     mtmp->mhp = 0; /* simplify some tests: force mhp to 0 */
  830.     relobj(mtmp, 0, FALSE);
  831.     relmon(mtmp);
  832.     newsym(mtmp->mx,mtmp->my);
  833.     unstuck(mtmp);
  834.     fill_pit(mtmp->mx, mtmp->my);
  835.  
  836.     if(mtmp->isshk) shkgone(mtmp);
  837.     if(mtmp->wormno) wormgone(mtmp);
  838. }
  839.  
  840. void
  841. mondead(mtmp)
  842. register struct monst *mtmp;
  843. {
  844.     int tmp, nk;
  845.  
  846.     if(mtmp->isgd) {
  847.         /* if we're going to abort the death, it *must* be before
  848.          * the m_detach or there will be relmon problems later */
  849.         if(!grddead(mtmp)) return;
  850.     }
  851.  
  852.     /* restore chameleon, lycanthropes to true form at death */
  853.     if(mtmp->cham) mtmp->data = &mons[PM_CHAMELEON];
  854.     if(mtmp->data == &mons[PM_WEREJACKAL])
  855.         mtmp->data = &mons[PM_HUMAN_WEREJACKAL];
  856.     if(mtmp->data == &mons[PM_WEREWOLF])
  857.         mtmp->data = &mons[PM_HUMAN_WEREWOLF];
  858.     if(mtmp->data == &mons[PM_WERERAT])
  859.         mtmp->data = &mons[PM_HUMAN_WERERAT];
  860.  
  861.     /* if MAXMONNO monsters of a given type have died, and it
  862.      * can be done, extinguish that monster.
  863.      *
  864.      * u.nr_killed does double duty as total number of dead monsters
  865.      * and as experience factor for the player killing more monsters.
  866.      * this means that a dragon dying by other means reduces the
  867.      * experience the player gets for killing a dragon directly; this
  868.      * is probably not too bad, since the player likely finagled the
  869.      * first dead dragon via ring of conflict or pets, and extinguishing
  870.      * based on only player kills probably opens more avenues of abuse
  871.      * for rings of conflict and such.
  872.      */
  873.     tmp = monsndx(mtmp->data);
  874.     u.nr_killed[tmp]++;
  875.     nk = u.nr_killed[tmp];
  876.     if(nk > (tmp == PM_NAZGUL ? 9 : tmp == PM_ERINYES ? 3 : MAXMONNO) &&
  877.                 !(mons[tmp].geno & (G_NOGEN | G_EXTINCT))) {
  878. #ifdef DEBUG
  879.         pline("Automatically extinguished %s.", makeplural(mons[tmp].mname));
  880. #endif
  881.         mons[tmp].geno |= G_EXTINCT;
  882.     }
  883. #ifdef MAIL
  884.     /* if the mail daemon dies, no more mail delivery.  -3. */
  885.     else if(tmp==PM_MAIL_DAEMON) mons[tmp].geno |= G_GENOD;
  886. #endif
  887.  
  888. #ifdef KOPS
  889.     if(mtmp->data->mlet == S_KOP && allow_kops) {
  890.         /* Dead Kops may come back. */
  891.         switch(rnd(5)) {
  892.         case 1:         /* returns near the stairs */
  893.             (void) makemon(mtmp->data,xdnstair,ydnstair);
  894.             break;
  895.         case 2:         /* randomly */
  896.             (void) makemon(mtmp->data,0,0);
  897.             break;
  898.         default:
  899.             break;
  900.         }
  901.     }
  902. #endif
  903.     if(mtmp->iswiz) wizdead(mtmp);
  904. #ifdef MULDGN
  905.     if(mtmp->data->msound == MS_NEMESIS) nemdead();
  906. #endif
  907.     m_detach(mtmp);
  908.     monfree(mtmp);
  909. }
  910.  
  911. /* drop (perhaps) a cadaver and remove monster */
  912. void
  913. mondied(mdef)
  914. register struct monst *mdef;
  915. {
  916.     mondead(mdef);
  917.     if(rn2(3)
  918. #ifdef REINCARNATION
  919.        && !Is_rogue_level(&u.uz)
  920. #endif
  921.                     )
  922.         (void) make_corpse(mdef);
  923. }
  924.  
  925. /* monster disappears, not dies */
  926. void
  927. mongone(mdef)
  928. register struct monst *mdef;
  929. {
  930.     register struct obj *otmp, *otmp2;
  931.  
  932.     /* release monster's inventory */
  933.     for (otmp = mdef->minvent; otmp; otmp = otmp2) {
  934.         otmp2 = otmp->nobj;
  935.         obfree(otmp, (struct obj *)0);
  936.     }
  937.     mdef->minvent = 0;
  938.     mdef->mgold = 0;
  939.     m_detach(mdef);
  940.     monfree(mdef);
  941. }
  942.  
  943. /* drop a statue or rock and remove monster */
  944. void
  945. monstone(mdef)
  946. register struct monst *mdef;
  947. {
  948.     struct obj *otmp, *contents;
  949.     xchar x = mdef->mx, y = mdef->my;
  950.  
  951.     if((int)mdef->data->msize > MZ_TINY ||
  952.        !rn2(2 + ((mdef->data->geno & G_FREQ) > 2))) {
  953.         otmp = mk_named_object(STATUE, mdef->data, x, y,
  954.             NAME(mdef), (int)mdef->mnamelth);
  955.         contents = otmp->cobj = mdef->minvent;
  956.         while(contents) {
  957.             contents->owornmask = 0L;
  958.             contents = contents->nobj;
  959.         }
  960.         mdef->minvent = (struct obj *)0;
  961.         if (mdef->mgold) {
  962.             struct obj *au;
  963.             au = mksobj(GOLD_PIECE, FALSE, FALSE);
  964.             au->quan = mdef->mgold;
  965.             au->owt = weight(au);
  966.             mdef->mgold = 0;
  967.             au->nobj = otmp->cobj;
  968.             otmp->cobj = au;
  969.         }
  970.         otmp->owt = weight(otmp);
  971.     } else
  972.         otmp = mksobj_at(ROCK, x, y, TRUE);
  973.  
  974.     mondead(mdef);
  975.  
  976.     stackobj(otmp);
  977.     if (cansee(x, y)) newsym(x,y);
  978. }
  979.  
  980. /* another monster has killed the monster mdef */
  981. void
  982. monkilled(mdef, fltxt, how)
  983. register struct monst *mdef;
  984. const char *fltxt;
  985. uchar how;
  986. {
  987.     if (cansee(mdef->mx, mdef->my) && fltxt)
  988.         pline("%s is %s%s%s!", Monnam(mdef),
  989.             (is_demon(mdef->data) || is_undead(mdef->data)) ?
  990.              "destroyed" : "killed",
  991.             *fltxt ? " by the " : "",
  992.             fltxt
  993.          );
  994.     else if(mdef->mtame)
  995.         You("have a sad feeling for a moment, then it passes.");
  996.  
  997.     /* no corpses if digested */
  998.     if(how == AD_DGST)
  999.         mondead(mdef);
  1000.     else
  1001.         mondied(mdef);
  1002. }
  1003.  
  1004. void
  1005. unstuck(mtmp)
  1006. register struct monst *mtmp;
  1007. {
  1008.     if(u.ustuck == mtmp) {
  1009.         if(u.uswallow){
  1010.             u.ux = mtmp->mx;
  1011.             u.uy = mtmp->my;
  1012.             u.uswallow = 0;
  1013.             u.uswldtim = 0;
  1014.             if (Punished) placebc();
  1015.             vision_full_recalc = 1;
  1016.             docrt();
  1017.         }
  1018.         u.ustuck = 0;
  1019.     }
  1020. }
  1021.  
  1022. void
  1023. killed(mtmp)
  1024. register struct monst *mtmp;
  1025. {
  1026.     xkilled(mtmp, 1);
  1027. }
  1028.  
  1029. /* the player has killed the monster mtmp */
  1030. void
  1031. xkilled(mtmp, dest)
  1032.     register struct monst *mtmp;
  1033. /*
  1034.  * Dest=1, normal; dest=0, don't print message; dest=2, don't drop corpse
  1035.  * either; dest=3, message but no corpse
  1036.  */
  1037.     int    dest;
  1038. {
  1039.     register int tmp, x = mtmp->mx, y = mtmp->my;
  1040.     register struct permonst *mdat;
  1041.     register struct obj *otmp;
  1042.     register struct trap *t;
  1043.     boolean chance, redisp = FALSE;
  1044.     boolean wasinside = u.uswallow && (u.ustuck == mtmp);
  1045.  
  1046.     if (dest & 1) {
  1047.         if(!canseemon(mtmp) && !sensemon(mtmp)) You("destroy it!");
  1048.         else {
  1049.         You("destroy %s!",
  1050.             mtmp->mtame ? x_monnam(mtmp, 0, "poor", 0)
  1051.             : mon_nam(mtmp));
  1052.         }
  1053.     }
  1054.  
  1055.     if (mtmp->mtrapped &&
  1056.         ((t = t_at(x, y)) && (t->ttyp == PIT || t->ttyp == SPIKED_PIT)) &&
  1057.         sobj_at(BOULDER, x, y))
  1058.         dest ^= 2; /*
  1059.                 * Prevent corpses/treasure being created "on top"
  1060.                 * of the boulder that is about to fall in. This is
  1061.                 * out of order, but cannot be helped unless this
  1062.                 * whole routine is rearranged.
  1063.                 */
  1064.  
  1065.     /* dispose of monster and make cadaver */
  1066.     if(stoned) monstone(mtmp);
  1067.     else mondead(mtmp);
  1068.  
  1069.     mdat = mtmp->data; /* note: mondead can change mtmp->data */
  1070.  
  1071.     if (stoned) {
  1072.         stoned = FALSE;
  1073.         goto cleanup;
  1074.     }
  1075.  
  1076.     if((dest & 2)
  1077. #ifdef REINCARNATION
  1078.          || Is_rogue_level(&u.uz)
  1079. #endif
  1080.        || (mdat == &mons[PM_WRAITH] && Is_valley(&u.uz) && rn2(5)))
  1081.         goto cleanup;
  1082.  
  1083. #ifdef MAIL
  1084.     if(mdat == &mons[PM_MAIL_DAEMON]) {
  1085.         (void) mksobj_at(SCR_MAIL, x, y, FALSE);
  1086.         stackobj(fobj);
  1087.         redisp = TRUE;
  1088.     }
  1089. #endif
  1090.     if(!accessible(x, y)) {
  1091.         /* might be mimic in wall or dead eel or in a pool or lava */
  1092.         redisp = TRUE;
  1093.         if(wasinside) spoteffects();
  1094.     } else if(x != u.ux || y != u.uy) {
  1095.         /* might be here after swallowed */
  1096.         if (!rn2(6) && !(mdat->geno & G_NOCORPSE)
  1097. #ifdef KOPS
  1098.                     && mdat->mlet != S_KOP
  1099. #endif
  1100.                             ) {
  1101.             int typ;
  1102.  
  1103.             otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE);
  1104.             /* Don't create large objects from small monsters */
  1105.             typ = otmp->otyp;
  1106.             if (mdat->msize < MZ_HUMAN && typ != FOOD_RATION
  1107. #ifdef WALKIES
  1108.                 && typ != LEASH
  1109. #endif
  1110.                 && typ != FIGURINE
  1111.                 && (otmp->owt > 3 ||
  1112.                 (typ >= SPEAR && typ <= LANCE) ||
  1113.                 (typ >= SCIMITAR && typ <= KATANA) ||
  1114.                 (typ == MORNING_STAR || typ == QUARTERSTAFF) ||
  1115.                 (typ >= BARDICHE && typ <= VOULGE) ||
  1116.                 (typ >= PLATE_MAIL &&
  1117.                         typ <= YELLOW_DRAGON_SCALE_MAIL) ||
  1118.                 (typ == LARGE_SHIELD))) {
  1119.                 delobj(otmp);
  1120.             } else redisp = TRUE;
  1121.         }
  1122.         /* Whether or not it always makes a corpse is, in theory,
  1123.          * different from whether or not the corpse is "special";
  1124.          * if we want both, we have to specify it explicitly.
  1125.          */
  1126.         if (bigmonst(mdat) || mdat == &mons[PM_LIZARD]
  1127.                || is_golem(mdat)
  1128.                || is_mplayer(mdat)
  1129.                || is_rider(mdat))
  1130.             chance = 1;
  1131.         else chance = !rn2((int)
  1132.             (2 + ((mdat->geno & G_FREQ)<2) + verysmall(mdat)));
  1133.         if (chance)
  1134.             (void) make_corpse(mtmp);
  1135.     }
  1136.     if(redisp) newsym(x,y);
  1137. cleanup:
  1138.     /* punish bad behaviour */
  1139.     if(is_human(mdat) && !always_hostile(mdat) &&
  1140.        (monsndx(mdat) < PM_ARCHEOLOGIST || monsndx(mdat) > PM_WIZARD) &&
  1141.        u.ualign.type != A_CHAOTIC) {
  1142.         HTelepat &= ~INTRINSIC;
  1143.         change_luck(-2);
  1144.         if (Blind && !Telepat)
  1145.             see_monsters(); /* Can't sense monsters any more. */
  1146.     }
  1147.     if((mtmp->mpeaceful && !rn2(2)) || mtmp->mtame)    change_luck(-1);
  1148.     if (mdat->mlet == S_UNICORN &&
  1149.                 sgn(u.ualign.type) == sgn(mdat->maligntyp))
  1150.         change_luck(-5);
  1151.  
  1152.     /* give experience points */
  1153.     tmp = experience(mtmp, u.nr_killed[monsndx(mdat)] + 1);
  1154.     more_experienced(tmp, 0);
  1155.     newexplevel();        /* will decide if you go up */
  1156.  
  1157.     /* adjust alignment points */
  1158. #ifdef MULDGN
  1159.     if(mdat->msound == MS_LEADER)        /* REAL BAD! */
  1160.         adjalign(-(u.ualign.record+(int)ALIGNLIM/2));
  1161.     else if(mdat->msound == MS_NEMESIS)    /* Real good! */
  1162.         adjalign((int)(ALIGNLIM/4));
  1163.     else if(mdat->msound == MS_GUARDIAN)    /* Bad */
  1164.         adjalign(-(int)(ALIGNLIM/8));
  1165.     else
  1166. #endif
  1167.         if (mtmp->ispriest) {
  1168.         adjalign((p_coaligned(mtmp)) ? -2 : 2);
  1169.         if(mdat->maligntyp == A_NONE)
  1170.             adjalign((int)(ALIGNLIM / 4));        /* BIG bonus */
  1171.     } else if(mtmp->mtame)
  1172.         adjalign(-15);    /* bad!! */
  1173.     else if (mtmp->mpeaceful)
  1174.         adjalign(-5);
  1175.  
  1176.     /* malign was already adjusted for u.ualign.type and randomization */
  1177.     adjalign(mtmp->malign);
  1178. }
  1179.  
  1180. /* changes the monster into a stone monster of the same type */
  1181. /* this should only be called when poly_when_stoned() is true */
  1182. void
  1183. mon_to_stone(mtmp)
  1184.     register struct monst *mtmp;
  1185. {
  1186.     if(mtmp->data->mlet == S_GOLEM) {
  1187.     /* it's a golem, and not a stone golem */
  1188.     if(canseemon(mtmp))
  1189.         pline("%s solidifies...", Monnam(mtmp));
  1190.     (void) newcham(mtmp, &mons[PM_STONE_GOLEM]);
  1191.     if(canseemon(mtmp))
  1192.         pline("Now it's %s", a_monnam(mtmp));
  1193.     } else
  1194.     impossible("Can't polystone %s", a_monnam(mtmp));
  1195. }
  1196.  
  1197. void
  1198. mnexto(mtmp)    /* Make monster mtmp next to you (if possible) */
  1199.     struct monst *mtmp;
  1200. {
  1201.     coord mm;
  1202.  
  1203.     if(!enexto(&mm, u.ux, u.uy, mtmp->data)) return;
  1204.  
  1205.     rloc_to(mtmp, mm.x, mm.y);
  1206. }
  1207.  
  1208. /* mnearto()
  1209.  * Put monster near (or at) location if possible.
  1210.  * Returns:
  1211.  *    1 - if a monster was moved from x, y to put mtmp at x, y.
  1212.  *    0 - in most cases.
  1213.  */
  1214. boolean
  1215. mnearto(mtmp,x,y,move_other)
  1216. register struct monst *mtmp;
  1217. xchar x, y;
  1218. boolean move_other;    /* make sure mtmp gets to x, y! so move m_at(x, y) */
  1219. {
  1220.     struct monst *othermon = (struct monst *)0;
  1221.     xchar newx, newy;
  1222.     coord mm;
  1223.  
  1224.     if ((mtmp->mx == x) && (mtmp->my == y)) return(FALSE);
  1225.  
  1226.     if (move_other && (othermon = m_at(x, y))) {
  1227.         if (othermon->wormno)
  1228.             remove_worm(othermon);
  1229.         else
  1230.             remove_monster(x, y);
  1231.     }
  1232.  
  1233.     newx = x;
  1234.     newy = y;
  1235.  
  1236.     if (!goodpos(newx, newy, mtmp, mtmp->data)) {
  1237.         /* actually we have real problems if enexto ever fails.
  1238.          * migrating_mons that need to be placed will cause
  1239.          * no end of trouble.
  1240.          */
  1241.         if (!enexto(&mm, newx, newy, mtmp->data)) return(FALSE);
  1242.         newx = mm.x; newy = mm.y;
  1243.     }
  1244.  
  1245.     rloc_to(mtmp, newx, newy);
  1246.  
  1247.     if (move_other && othermon) {
  1248.         othermon->mx = othermon->my = 0;
  1249.         (void) mnearto(othermon, x, y, FALSE);
  1250.         if ((othermon->mx != x) || (othermon->my != y))
  1251.         return(TRUE);
  1252.     }
  1253.  
  1254.     return(FALSE);
  1255. }
  1256.  
  1257.  
  1258. static const char *poiseff[] = {
  1259.  
  1260.     " feel very weak", "r brain is on fire",
  1261.     "r judgement is impaired", "r muscles won't obey you",
  1262.     " feel very sick", " break out in hives"
  1263. };
  1264.  
  1265. void
  1266. poisontell(typ)
  1267.  
  1268.     int    typ;
  1269. {
  1270.     pline("You%s.", poiseff[typ]);
  1271. }
  1272.  
  1273. void
  1274. poisoned(string, typ, pname, fatal)
  1275. register const char *string, *pname;
  1276. register int  typ, fatal;
  1277. {
  1278.     register int i, plural;
  1279.     boolean thrown_weapon = !strncmp(string, "poison", 6);
  1280.         /* admittedly a kludge... */
  1281.  
  1282.     if(strcmp(string, "blast") && !thrown_weapon) {
  1283.         /* 'blast' has already given a 'poison gas' message */
  1284.         /* so have "poison arrow", "poison dart", etc... */
  1285.         plural = (string[strlen(string) - 1] == 's')? 1 : 0;
  1286.         /* avoid "The" Orcus's sting was poisoned... */
  1287.         pline("%s%s %s poisoned!", isupper(*string) ? "" : "The ",
  1288.             string, plural ? "were" : "was");
  1289.     }
  1290.  
  1291.     if(Poison_resistance) {
  1292.         if(!strcmp(string, "blast")) shieldeff(u.ux, u.uy);
  1293.         pline("The poison doesn't seem to affect you.");
  1294.         return;
  1295.     }
  1296.     i = rn2(fatal + 20*thrown_weapon);
  1297.     if(i == 0 && typ != A_CHA) {
  1298.         u.uhp = -1;
  1299.         pline("The poison was deadly...");
  1300.     } else if(i <= 5) {
  1301.         pline("You%s!", poiseff[typ]);
  1302.         (void) adjattrib(typ, thrown_weapon ? -1 : -rn1(3,3), TRUE);
  1303.     } else {
  1304.         i = thrown_weapon ? rnd(6) : rn1(10,6);
  1305.         if(Half_physical_damage) i = (i+1) / 2;
  1306.         losehp(i, pname, KILLED_BY_AN);
  1307.     }
  1308.     if(u.uhp < 1) {
  1309.         killer_format = KILLED_BY_AN;
  1310.         killer = pname;
  1311.         done(POISONING);
  1312.     }
  1313. }
  1314.  
  1315. /* monster responds to player action; not the same as a passive attack */
  1316. /* assumes reason for response has been tested, and response _must_ be made */
  1317. void
  1318. m_respond(mtmp)
  1319. register struct monst *mtmp;
  1320. {
  1321.     if(mtmp->data->msound == MS_SHRIEK) {
  1322.     if(flags.soundok)
  1323.         pline("%s shrieks.", Monnam(mtmp));
  1324.     aggravate();
  1325.     }
  1326. }
  1327.  
  1328. #endif /* OVLB */
  1329. #ifdef OVL2
  1330.  
  1331. void
  1332. setmangry(mtmp)
  1333. register struct monst *mtmp;
  1334. {
  1335.     mtmp->data->mflags3 &= ~M3_WAITMASK;
  1336.     if(!mtmp->mpeaceful) return;
  1337.     if(mtmp->mtame) return;
  1338.     mtmp->mpeaceful = 0;
  1339.     if(mtmp->ispriest) {
  1340.         if(p_coaligned(mtmp)) adjalign(-5); /* very bad */
  1341.         else adjalign(2);
  1342.     } else
  1343.         adjalign(-1);        /* attacking peaceful monsters is bad */
  1344.     if(humanoid(mtmp->data) || mtmp->isshk || mtmp->isgd)
  1345.         pline("%s gets angry!", Monnam(mtmp));
  1346. #ifdef SOUNDS
  1347.     else if (flags.verbose && flags.soundok) growl(mtmp);
  1348. #endif
  1349. }
  1350.  
  1351. void
  1352. wakeup(mtmp)
  1353. register struct monst *mtmp;
  1354. {
  1355.     mtmp->msleep = 0;
  1356.     mtmp->meating = 0;    /* assume there's no salvagable food left */
  1357.     setmangry(mtmp);
  1358.     if(mtmp->m_ap_type) seemimic(mtmp);
  1359. }
  1360.  
  1361. /* Wake up nearby monsters. */
  1362. void
  1363. wake_nearby()
  1364. {
  1365.     register struct monst *mtmp;
  1366.  
  1367.     for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
  1368.         if (distu(mtmp->mx,mtmp->my) < u.ulevel*20) {
  1369.         if(mtmp->msleep)  mtmp->msleep = 0;
  1370.         if(mtmp->mtame)   EDOG(mtmp)->whistletime = moves;
  1371.         }
  1372.     }
  1373. }
  1374.  
  1375. /* NOTE: we must check for mimicry before calling this routine */
  1376. void
  1377. seemimic(mtmp)
  1378. register struct monst *mtmp;
  1379. {
  1380.     /*
  1381.      *  Discovered mimics don't block light.
  1382.      */
  1383.     if ((mtmp->m_ap_type == M_AP_FURNITURE &&
  1384.         (mtmp->mappearance==S_hcdoor || mtmp->mappearance==S_vcdoor))||
  1385.         (mtmp->m_ap_type == M_AP_OBJECT && mtmp->mappearance == BOULDER))
  1386.         unblock_point(mtmp->mx,mtmp->my);
  1387.  
  1388.     mtmp->m_ap_type = M_AP_NOTHING;
  1389.     mtmp->mappearance = 0;
  1390.     newsym(mtmp->mx,mtmp->my);
  1391. }
  1392.  
  1393. /* force all chameleons to become normal */
  1394. void
  1395. rescham()
  1396. {
  1397.     register struct monst *mtmp;
  1398.  
  1399.     for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
  1400.         if(mtmp->cham) {
  1401.             mtmp->cham = 0;
  1402.             (void) newcham(mtmp, &mons[PM_CHAMELEON]);
  1403.         }
  1404.         if(is_were(mtmp->data) && mtmp->data->mlet != S_HUMAN)
  1405.             new_were(mtmp);
  1406.         if(mtmp->m_ap_type && cansee(mtmp->mx, mtmp->my)) {
  1407.             seemimic(mtmp);
  1408.             /* we pretend that the mimic doesn't */
  1409.             /* know that it has been unmasked.   */
  1410.             mtmp->msleep = 1;
  1411.         }
  1412.     }
  1413. }
  1414.  
  1415. /* Let the chameleons change again -dgk */
  1416. void
  1417. restartcham()
  1418. {
  1419.     register struct monst *mtmp;
  1420.  
  1421.     for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
  1422.         if (mtmp->data == &mons[PM_CHAMELEON])
  1423.             mtmp->cham = 1;
  1424.         if(mtmp->data->mlet == S_MIMIC && mtmp->msleep &&
  1425.                 cansee(mtmp->mx, mtmp->my)) {
  1426.             set_mimic_sym(mtmp);
  1427.             newsym(mtmp->mx,mtmp->my);
  1428.         }
  1429.     }
  1430. }
  1431.  
  1432. /* unwatched hiders may hide again; if so, a 1 is returned.  */
  1433. STATIC_OVL boolean
  1434. restrap(mtmp)
  1435. register struct monst *mtmp;
  1436. {
  1437.     if(mtmp->cham || mtmp->mcan || mtmp->m_ap_type ||
  1438.        cansee(mtmp->mx, mtmp->my) || rn2(3) || (mtmp == u.ustuck))
  1439.         return(FALSE);
  1440.  
  1441.     if(mtmp->data->mlet == S_MIMIC) {
  1442.         set_mimic_sym(mtmp);
  1443.         return(TRUE);
  1444.     } else
  1445.         if(levl[mtmp->mx][mtmp->my].typ == ROOM)  {
  1446.         mtmp->mundetected = 1;
  1447.         return(TRUE);
  1448.         }
  1449.  
  1450.     return(FALSE);
  1451. }
  1452.  
  1453. /* make a chameleon look like a new monster; returns 1 if it actually changed */
  1454. int
  1455. newcham(mtmp, mdat)
  1456. register struct monst *mtmp;
  1457. register struct permonst *mdat;
  1458. {
  1459.     register int mhp, hpn, hpd;
  1460.     int tryct;
  1461.     struct permonst *olddata = mtmp->data;
  1462.  
  1463.     /* mdat = 0 -> caller wants a random monster shape */
  1464.     tryct = 0;
  1465.     if(mdat == 0) {
  1466.         while (++tryct < 100) {
  1467.             mdat = &mons[rn2(NUMMONS)];
  1468.             /* polyok rules out all M2_PNAME and M2_WERE's */
  1469.             if (!is_human(mdat) && polyok(mdat)
  1470.                     && !(mdat->geno & G_GENOD))
  1471.                 break;
  1472.         }
  1473.         if (tryct >= 100) return(0); /* Should never happen */
  1474.     }
  1475.  
  1476.     if(is_male(mdat)) {
  1477.         if(mtmp->female) mtmp->female = FALSE;
  1478.     } else if (is_female(mdat)) {
  1479.         if(!mtmp->female) mtmp->female = TRUE;
  1480.     } else if (!is_neuter(mdat)) {
  1481.         if(!rn2(10)) mtmp->female = !mtmp->female;
  1482.     }
  1483.  
  1484.     if(mdat == mtmp->data) return(0);    /* still the same monster */
  1485.  
  1486.     if(mtmp->wormno) {            /* throw tail away */
  1487.         wormgone(mtmp);
  1488.         place_monster(mtmp, mtmp->mx, mtmp->my);
  1489.     }
  1490.  
  1491.     hpn = mtmp->mhp;
  1492.     hpd = (mtmp->m_lev < 50) ? ((int)mtmp->m_lev)*8 : mdat->mlevel;
  1493.     if(!hpd) hpd = 4;
  1494.  
  1495.     mtmp->m_lev = adj_lev(mdat);        /* new monster level */
  1496.  
  1497.     mhp = (mtmp->m_lev < 50) ? ((int)mtmp->m_lev)*8 : mdat->mlevel;
  1498.     if(!mhp) mhp = 4;
  1499.  
  1500.     /* new hp: same fraction of max as before */
  1501. #ifndef LINT
  1502.     mtmp->mhp = (int)(((long)hpn*(long)mhp)/(long)hpd);
  1503. #endif
  1504.     if(mtmp->mhp < 0) mtmp->mhp = hpn;    /* overflow */
  1505. /* Unlikely but not impossible; a 1HD creature with 1HP that changes into a
  1506.    0HD creature will require this statement */
  1507.     if (!mtmp->mhp) mtmp->mhp = 1;
  1508.  
  1509. /* and the same for maximum hit points */
  1510.     hpn = mtmp->mhpmax;
  1511. #ifndef LINT
  1512.     mtmp->mhpmax = (int)(((long)hpn*(long)mhp)/(long)hpd);
  1513. #endif
  1514.     if(mtmp->mhpmax < 0) mtmp->mhpmax = hpn;    /* overflow */
  1515.     if (!mtmp->mhpmax) mtmp->mhpmax = 1;
  1516.  
  1517.     mtmp->data = mdat;
  1518.     mtmp->minvis = !!(mdat->mlet == S_STALKER);
  1519.     if (!hides_under(mdat) || !OBJ_AT(mtmp->mx, mtmp->my))
  1520.         mtmp->mundetected = 0;
  1521.     if (u.ustuck == mtmp) {
  1522.         if(u.uswallow) {
  1523.             if(!attacktype(mdat,AT_ENGL)) {
  1524.                 /* Does mdat care? */
  1525.                 if (!noncorporeal(mdat) && !amorphous(mdat) &&
  1526.                     !is_whirly(mdat) &&
  1527.                     (mdat != &mons[PM_YELLOW_LIGHT])) {
  1528.                     You("break out of %s%s!", mon_nam(mtmp),
  1529.                         (is_animal(mdat)?
  1530.                         "'s stomach" : ""));
  1531.                     mtmp->mhp = 1;  /* almost dead */
  1532.                 }
  1533.                 expels(mtmp, olddata, FALSE);
  1534.             }
  1535.         } else {
  1536.             if(!sticks(mdat)
  1537. #ifdef POLYSELF
  1538.                 && !sticks(uasmon)
  1539. #endif
  1540.                 )
  1541.                 unstuck(mtmp);
  1542.         }
  1543.     }
  1544.  
  1545.     if ( (mdat == &mons[PM_LONG_WORM]) && (mtmp->wormno = get_wormno()) ) {
  1546.         /* we can now create worms with tails - 11/91 */
  1547.         initworm(mtmp, rn2(5));
  1548.         if (count_wsegs(mtmp))
  1549.         place_worm_tail_randomly(mtmp, mtmp->mx, mtmp->my);
  1550.     }
  1551.  
  1552.     newsym(mtmp->mx,mtmp->my);
  1553. #ifdef MUSE
  1554.     mon_break_armor(mtmp);
  1555.     possibly_unwield(mtmp);
  1556. #endif
  1557.     return(1);
  1558. }
  1559.  
  1560. #endif /* OVL2 */
  1561. #ifdef OVLB
  1562.  
  1563. void
  1564. golemeffects(mon, damtype, dam)
  1565. register struct monst *mon;
  1566. int damtype, dam;
  1567. {
  1568.     int heal=0, slow=0;
  1569.  
  1570.     if (mon->data != &mons[PM_FLESH_GOLEM]
  1571.                     && mon->data != &mons[PM_IRON_GOLEM])
  1572.         return;
  1573.  
  1574.     if (mon->data == &mons[PM_FLESH_GOLEM]) {
  1575.         if (damtype == AD_ELEC) heal = dam / 6;
  1576.         else if (damtype == AD_FIRE || damtype == AD_COLD) slow = 1;
  1577.     } else {
  1578.         if (damtype == AD_ELEC) slow = 1;
  1579.         else if (damtype == AD_FIRE) heal = dam;
  1580.     }
  1581.     if (slow) {
  1582.         if (mon->mspeed != MSLOW) {
  1583.             if (mon->mspeed == MFAST) mon->mspeed = 0;
  1584.             else mon->mspeed = MSLOW;
  1585.             if (cansee(mon->mx, mon->my))
  1586.                 pline("%s seems to be moving slower.",
  1587.                     Monnam(mon));
  1588.         }
  1589.     }
  1590.     if (heal) {
  1591.         if (mon->mhp < mon->mhpmax) {
  1592.             mon->mhp += dam;
  1593.             if (mon->mhp > mon->mhpmax) mon->mhp = mon->mhpmax;
  1594.             if (cansee(mon->mx, mon->my))
  1595.                 pline("%s seems healthier.", Monnam(mon));
  1596.         }
  1597.     }
  1598. }
  1599.  
  1600. boolean
  1601. angry_guards(silent)
  1602. register boolean silent;
  1603. {
  1604.     register struct monst *mtmp;
  1605.     register int ct = 0, nct = 0, sct = 0, slct = 0;
  1606.  
  1607.     for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
  1608.         if((mtmp->data == &mons[PM_WATCHMAN] ||
  1609.                    mtmp->data == &mons[PM_WATCH_CAPTAIN])
  1610.                     && mtmp->mpeaceful) {
  1611.             ct++;
  1612.             if(cansee(mtmp->mx, mtmp->my) && mtmp->mcanmove) {
  1613.                 if (distu(mtmp->mx, mtmp->my) == 2) nct++;
  1614.                 else sct++;
  1615.             }
  1616.             if(mtmp->msleep || mtmp->mfrozen) {
  1617.                 slct++;
  1618.                 mtmp->msleep = mtmp->mfrozen = 0;
  1619.             }
  1620.             mtmp->mpeaceful = 0;
  1621.         }
  1622.     }
  1623.     if(ct) {
  1624.         if(!silent) { /* do we want pline msgs? */
  1625.         if(slct) pline("The guard%s wake%s up!",
  1626.                  slct > 1 ? "s" : "", slct == 1 ? "s" : "");
  1627.         if(nct || sct) {
  1628.             if(nct) pline("The guard%s get%s angry!",
  1629.                 nct == 1 ? "" : "s", nct == 1 ? "s" : "");
  1630.             else if(!Blind)
  1631.                 You("see %sangry guard%s approaching!",
  1632.                   sct == 1 ? "an " : "", sct > 1 ? "s" : "");
  1633.         } else if(flags.soundok)
  1634.             You("hear the shrill sound of a guard's whistle.");
  1635.         }
  1636.         return(TRUE);
  1637.     }
  1638.     return(FALSE);
  1639. }
  1640.  
  1641. void
  1642. pacify_guards()
  1643. {
  1644.     register struct monst *mtmp;
  1645.  
  1646.     for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
  1647.         if (mtmp->data == &mons[PM_WATCHMAN] ||
  1648.         mtmp->data == &mons[PM_WATCH_CAPTAIN])
  1649.         mtmp->mpeaceful = 1;
  1650.     }
  1651. }
  1652. #endif /* OVLB */
  1653.  
  1654. /*mon.c*/
  1655.